"""
@Author: li
@Email: lijianqiao2906@live.com
@FileName: auth.py
@DateTime: 2025/07/06
@Docs: 认证授权相关API
"""

from fastapi import APIRouter, BackgroundTasks

from app.models import User
from app.schemas import LoginLogCreate, LoginRequest, TokenResponse
from app.schemas.user import UserRead
from app.services.auth import auth_service
from app.services.system import login_log_service
from app.services.user import user_service
from app.utils.deps import ClientInfoDep, CurrentUserDep
from app.utils.logger import logger

router = APIRouter()


@router.post("/login", response_model=TokenResponse, summary="用户登录")
async def login(
    login_data: LoginRequest,
    background_tasks: BackgroundTasks,
    client_info: ClientInfoDep,
) -> TokenResponse:
    """
    通过用户名和密码进行登录，成功后返回JWT。
    """
    # 1. 认证用户并获取令牌
    login_response = await auth_service.login(login_data)
    user = login_response.user
    token_data = login_response.token

    # 2. 添加后台任务：更新最后登录时间并记录日志
    background_tasks.add_task(user_service.update_last_login, user_id=user.id)
    log_info = LoginLogCreate(
        user_id=user.id,
        login_type="password",
        is_success=True,
        ip_address=client_info["ip"],
        user_agent=client_info["user_agent"],
    )
    background_tasks.add_task(login_log_service.create, **log_info.model_dump())

    return token_data


@router.get("/me", response_model=UserRead, summary="获取当前用户信息")
async def get_current_user_info(current_user: CurrentUserDep) -> User:
    """
    获取当前登录用户的详细信息。
    """
    return current_user


@router.post("/logout", summary="用户登出")
async def logout(
    current_user: CurrentUserDep,
    background_tasks: BackgroundTasks,
    client_info: ClientInfoDep,
) -> dict:
    """
    用户登出。
    在基于Token的认证中，这主要是一个形式上的端点。
    客户端应负责清除本地存储的Token。
    未来可在此处集成Token黑名单机制。
    """
    logger.info(f"用户 {current_user.username} 登出。")

    # 记录登出日志
    log_info = LoginLogCreate(
        user_id=current_user.id,
        login_type="logout",
        is_success=True,
        ip_address=client_info["ip"],
        user_agent=client_info["user_agent"],
    )
    background_tasks.add_task(login_log_service.create, **log_info.model_dump())

    return {"message": "登出成功"}
